// src/utils/cron-utils.js
import cronParser from 'cron-parser'

/**
 * 验证cron表达式是否有效
 * @param {string} cronExpression - cron表达式
 * @returns {boolean} 是否有效
 */
export function validateCronExpression(cronExpression) {
    if (!cronExpression || typeof cronExpression !== 'string') {
        return false
    }

    try {
        // 清理表达式：去除首尾空白字符
        const cleanedExpression = cronExpression.trim()

        // 检查字段数量
        const fieldCount = cleanedExpression.split(/\s+/).length
        if (fieldCount !== 5 && fieldCount !== 6) {
            console.warn('Cron表达式字段数量不正确:', fieldCount)
            return false
        }

        const options = {
            currentDate: new Date(),
            utc: false, // 不使用UTC
            tz: 'Asia/Shanghai' // 明确指定时区
        }

        cronParser.parse(cleanedExpression, options)
        return true
    } catch (error) {
        console.warn('Cron表达式验证失败:', error.message)
        return false
    }
}

/**
 * 根据cron表达式计算下次执行时间
 * @param {string} cronExpression - cron表达式
 * @returns {string|null} 下次执行时间的字符串表示
 */
export function getNextExecutionTime(cronExpression) {
    if (!cronExpression || typeof cronExpression !== 'string') {
        return null
    }


    try {
        // 清理表达式
        const cleanedExpression = cronExpression.trim()

        // 配置解析选项
        const options = {
            currentDate: new Date(),
            utc: false, // 重要：禁用UTC
            tz: 'Asia/Shanghai' // 设置时区
        }

        const interval = cronParser.parse(cleanedExpression, options)
        const next = interval.next()

        return next.toDate().toLocaleString('zh-CN', {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit'
        }).replace(/\//g, '-')

    } catch (error) {
        console.warn('Invalid cron expression:', cronExpression, 'Error details:', error.message)

        // 提供详细的错误信息
        if (error.message.includes('Field') && error.message.includes('out of range')) {
            console.error('可能的原因：表达式字段值超出有效范围')
        }

        return null
    }
}

/**
 * 获取接下来几次执行时间（用于调试）
 * @param {string} cronExpression - cron表达式
 * @param {number} count - 获取次数
 * @returns {Array<string>} 执行时间数组
 */
export function getNextExecutions(cronExpression, count = 3) {
    if (!validateCronExpression(cronExpression)) {
        return []
    }

    try {
        const cleanedExpression = cronExpression.trim()
        const options = {
            currentDate: new Date(),
            utc: false,
            tz: 'Asia/Shanghai'
        }

        const interval = cronParser.parse(cleanedExpression, options)
        const results = []

        for (let i = 0; i < count; i++) {
            const next = interval.next()
            results.push(next.toDate().toLocaleString('zh-CN'))
        }

        return results
    } catch (error) {
        console.warn('获取执行时间失败:', error.message)
        return []
    }
}